package com.weixin.pay.web;


import com.github.binarywang.wxpay.bean.notify.WxPayNotifyResponse;
import com.github.binarywang.wxpay.bean.notify.WxPayOrderNotifyResult;
import com.github.binarywang.wxpay.bean.notify.WxPayRefundNotifyResult;
import com.github.binarywang.wxpay.bean.request.WxPayRefundRequest;
import com.github.binarywang.wxpay.bean.request.WxPayUnifiedOrderRequest;
import com.github.binarywang.wxpay.bean.result.WxPayRefundResult;
import com.github.binarywang.wxpay.exception.WxPayException;
import com.github.binarywang.wxpay.service.WxPayService;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.io.File;

@Api(value = "微信支付")
@RestController
@RequestMapping("wxPay")
public class WxPayController {

    @Autowired
    private WxPayService wxPayService;

    /**
     * 调用微信统一下单接口，使用组装生成支付所需的参数对象WxPayUnifiedOrderRequest
     *
     * @author jacklin
     * @param request
     * @param <T>
     */
    @ApiOperation(value = "统一下单接口,并组装所需要的支付参数")
    @PostMapping(value = "/createOrder")
    public <T> T createOrder(@RequestBody WxPayUnifiedOrderRequest request) throws WxPayException {
        return this.wxPayService.createOrder(request);
    }

    /**
     * 微信支付 - 申请退款
     *
     * @author jacklin
     * @param request 请求对象
     * @return WxPayRefundResult
     * @throws WxPayException
     */
    @ApiOperation(value = "退款")
    @PostMapping(value = "/refund")
    public WxPayRefundResult refund(@RequestBody WxPayRefundRequest request) throws WxPayException {
        return this.wxPayService.refund(request);
    }

    @ApiOperation(value = "支付回调通知处理")
    @PostMapping(value = "/notify/order")
    public String parseOrderNotifyResult(@RequestBody String xmlData) throws WxPayException {
        WxPayOrderNotifyResult notifyResult = this.wxPayService.parseOrderNotifyResult(xmlData);
        return WxPayNotifyResponse.success("成功");
    }

    @ApiOperation(value = "退款回调通知处理")
    @PostMapping(value = "/notify/refund")
    public String parseRefundNotifyResult(@RequestBody String xmlData) throws WxPayException {
        WxPayRefundNotifyResult wxPayRefundNotifyResult = this.wxPayService.parseRefundNotifyResult(xmlData);
        //可以根据自己的业务场景返回需要构造的对象
        return WxPayNotifyResponse.success("成功");
    }

    /**
     * 微信native支付 - 扫码支付模式一生成默认指定高度的二维码图片
     * 二维码的内容为链接，格式为：weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX
     * 其中XXXXX为商户需要填写的内容，商户将该链接生成二维码，如需要打印发布二维码，需要采用此格式。商户可调用第三方库生成二维码图片。
     * @param productId   产品ID
     * @param logoFile    商户logo图片文件对象，可以为空
     * @param sideLength  需要生成二维码的边长，如果为空，默认值为400mm
     * @return  生成二维码的字节数组
     * @author jacklin
     *
     * 扫码支付模式一详细文档参考：https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_4
     */
    public byte[] createScanPayQrcodeMode1(String productId, File logoFile, Integer sideLength) {
        return wxPayService.createScanPayQrcodeMode1(productId, logoFile, sideLength);
    }

    /**
     * 微信native支付 - 扫码支付模式一生成默认指定高度的二维码图片
     * 二维码的内容为链接，格式为：weixin://wxpay/bizpayurl?sign=XXXXX&appid=XXXXX&mch_id=XXXXX&product_id=XXXXXX&time_stamp=XXXXXX&nonce_str=XXXXX
     * 其中XXXXX为商户需要填写的内容，商户将该链接生成二维码，如需要打印发布二维码，需要采用此格式。商户可调用第三方库生成二维码图片。
     *
     * @param productId 商品Id
     * @return 生成二维码URL的链接
     * @author jacklin
     */
    public String createScanPayQrcodeMode1(String productId) {
        return wxPayService.createScanPayQrcodeMode1(productId);
    }

    /**
     * 微信native支付 - 扫码支付模式二生成默认指定高度的二维码图片
     * 对应链接格式：weixin：//wxpay/bizpayurl?sr=XXXXX。请商户调用第三方库将code_url生成二维码图片。
     *
     * 该模式链接较短，生成的二维码打印到结账小票上的识别率较高，模式二与模式一相比，流程更为简单，不依赖设置的回调支付URL。
     * 商户后台系统先调用微信支付的统一下单接口，微信后台系统返回链接参数code_url，商户后台系统将code_url值生成二维码图片，
     * 用户使用微信客户端扫码后发起支付。
     *
     * @param productId   产品ID
     * @param logoFile    商户logo图片文件对象，可以为空
     * @param sideLength  需要生成二维码的边长，如果为空，默认值为400mm
     * @return  生成二维码的字节数组
     * @author jacklin
     *
     * 扫码支付模式一详细文档参考：https://pay.weixin.qq.com/wiki/doc/api/native.php?chapter=6_5
     */
    public byte[] createScanPayQrcodeMode2(String productId, File logoFile, Integer sideLength) {
        return wxPayService.createScanPayQrcodeMode2(productId, logoFile, sideLength);
    }



}
